package main

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"github.com/Sirupsen/logrus"
)

type Node2 struct {
	ID     int    `gorm:"AUTO_INCREMENT"`
	Title  string `gorm:"length:255"`
	Lft    int    `gorm:"default:0"`
	Rgt    int    `gorm:"default:0"`
	Parent int    `gorm:"default:0"`
}

func (Node2) TableName() string {
	return "node"
}

// 指定 parentID 添加一个新的 node
// 如果 parentID 为零，则证明需是需要添加一个顶级的 node
// 而且可以通过 position 参数指定插入的新节点在 parentID 节点指定的第几个子元素
func (Node2) Add(parentID int, title string, position int) error {
	// parentID 必须存在 (允许为零)
	// 获取 parentID 下的第一级子节点
	// 根据子节点数量(如果插入的位置是默认位置的话)计算该值。
	// 如果 parentID 指定的节点没有任何子节点，则插入位置就是零
	// 找到插入位置本来的节点
	return nil
}

// 删除一个节点
func (Node2) Delete(nodeID int) error {
	// 指定的节点是否存在
	// 获取指定节点的所有子节点（一级还是所有?）
	// 在树中删除当前
	return nil
}

// 获取指定节点所有的子节点
func (Node2) GetDescendants(nodeID int) ([]Node2, error) {
	return []Node2{}, nil
}

func (Node2) GetDescendantsCount(NodeID int) (int, error) {
	return 0, nil
}

// 获取自顶向下的一条路径
func (Node2) GetPath(NodeID int) ([]Node2, error) {
	return []Node2{}, nil
}

// commission
// salary

const firstLevelCommissionPer = 0.5
const secondLevelCommissionPer = 0.3
const thirdlyLevelCommissionPer = 0.2
const totalCommissionPer = 0.2

func calcCommison(amount float64) {
	// get first level commission (only direct parent node)
	// get second level commission
	// get third level commission

	// 执行时 还是使用行锁
	// 这里需要查询三次 db，似乎没有必要使用 mmpt 暂时
	// 要三次获取完才能确定各节点的级别
}

// need a agent withdraw apply table
// withdraw manual or automatic in same interface
// withdraw need check

// callback 中进行什么处理 ???
// set order status is done
// user diamond increase
// does this user in agent tree
// if the answer is yes, go to commission dispatch process
// if the answer is no, do nothing
// admin site need a opt log

func main() {
	db, err := gorm.Open("mysql", "vagrant:vagrant@(vagrant:3306)/mptt?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		logrus.Error(err)
		return
	}
	defer db.Close()

	db.AutoMigrate(&Node2{})

	node := Node2{}
	node.Add(0, "a", 0)
}
